#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

//函数指针类型
typedef void (*func_t)();

#define NUM 5
func_t handlers[NUM];

//如下是任务
void DownLoad()
{
	printf("我是一个下载的任务...\n");
}
void Flush()
{
	printf("我是一个刷新的任务...\n");
}
void Log()
{
	printf("我是一个记录日志的任务...\n");
}

//注册
void registerHandler(func_t h[], func_t f)
{
	int i = 0;
	for (; i < NUM; i++)
	{
		if (h[i] == NULL) break;
	}
	if (i == NUM) return;
	h[i] = f;
}

int main()
{
	//注册任务
	registerHandler(handlers, DownLoad);
	registerHandler(handlers, Flush);
	registerHandler(handlers, Log);

	pid_t id = fork();
	if (id == 0)
	{
		//子进程
		while (1)
		{
			printf("我是子进程。pid：%d, ppid：%d\n", getpid(), getppid());
			sleep(3);
		}
		exit(10);
	}

	while (1)
	{
		int status = 0;
		pid_t rid = waitpid(id, &status, WNOHANG);
		if (rid > 0) 
		{
			printf("wait success! rid：%d, exit_code：%d, exit_signal：%d\n", rid, WEXITSTATUS(status), status & 0x7f);
			break;
		}
		else if (rid == 0)
		{
			//边等待子进程退出，父进程做自己的事情：采用函数指针进行回调
			int i = 0;
			for (; handlers[i]; i++)
			{
				handlers[i]();
			}

			printf("本轮非阻塞调用结束，子进程没有退出\n");
			sleep(1);
		}
		else
		{
			printf("等待失败\n");
			break;
		}
	}

	return 0;
}
